home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / h8300 / include / asm / processor.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.5 KB  |  141 lines

  1. /*
  2.  * include/asm-h8300/processor.h
  3.  *
  4.  * Copyright (C) 2002 Yoshinori Sato
  5.  *
  6.  * Based on: linux/asm-m68nommu/processor.h
  7.  *
  8.  * Copyright (C) 1995 Hamish Macdonald
  9.  */
  10.  
  11. #ifndef __ASM_H8300_PROCESSOR_H
  12. #define __ASM_H8300_PROCESSOR_H
  13.  
  14. /*
  15.  * Default implementation of macro that returns current
  16.  * instruction pointer ("program counter").
  17.  */
  18. #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  19.  
  20. #include <linux/compiler.h>
  21. #include <asm/segment.h>
  22. #include <asm/fpu.h>
  23. #include <asm/ptrace.h>
  24. #include <asm/current.h>
  25.  
  26. static inline unsigned long rdusp(void) {
  27.     extern unsigned int    sw_usp;
  28.     return(sw_usp);
  29. }
  30.  
  31. static inline void wrusp(unsigned long usp) {
  32.     extern unsigned int    sw_usp;
  33.     sw_usp = usp;
  34. }
  35.  
  36. /*
  37.  * User space process size: 3.75GB. This is hardcoded into a few places,
  38.  * so don't change it unless you know what you are doing.
  39.  */
  40. #define TASK_SIZE    (0xFFFFFFFFUL)
  41.  
  42. #ifdef __KERNEL__
  43. #define STACK_TOP    TASK_SIZE
  44. #define STACK_TOP_MAX    STACK_TOP
  45. #endif
  46.  
  47. /*
  48.  * This decides where the kernel will search for a free chunk of vm
  49.  * space during mmap's. We won't be using it
  50.  */
  51. #define TASK_UNMAPPED_BASE    0
  52.  
  53. struct thread_struct {
  54.     unsigned long  ksp;        /* kernel stack pointer */
  55.     unsigned long  usp;        /* user stack pointer */
  56.     unsigned long  ccr;        /* saved status register */
  57.     unsigned long  esp0;            /* points to SR of stack frame */
  58.     struct {
  59.         unsigned short *addr;
  60.         unsigned short inst;
  61.     } breakinfo;
  62. };
  63.  
  64. #define INIT_THREAD  {                        \
  65.     .ksp  = sizeof(init_stack) + (unsigned long)init_stack, \
  66.     .usp  = 0,                        \
  67.     .ccr  = PS_S,                        \
  68.     .esp0 = 0,                        \
  69.     .breakinfo = {                        \
  70.         .addr = (unsigned short *)-1,            \
  71.         .inst = 0                    \
  72.     }                            \
  73. }
  74.  
  75. /*
  76.  * Do necessary setup to start up a newly executed thread.
  77.  *
  78.  * pass the data segment into user programs if it exists,
  79.  * it can't hurt anything as far as I can tell
  80.  */
  81. #if defined(__H8300H__)
  82. #define start_thread(_regs, _pc, _usp)                    \
  83. do {                                    \
  84.     set_fs(USER_DS);           /* reads from user space */  \
  85.       (_regs)->pc = (_pc);                        \
  86.     (_regs)->ccr = 0x00;       /* clear all flags */        \
  87.     (_regs)->er5 = current->mm->start_data;    /* GOT base */  \
  88.     wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3);    \
  89. } while(0)
  90. #endif
  91. #if defined(__H8300S__)
  92. #define start_thread(_regs, _pc, _usp)                    \
  93. do {                                    \
  94.     set_fs(USER_DS);           /* reads from user space */  \
  95.     (_regs)->pc = (_pc);                        \
  96.     (_regs)->ccr = 0x00;       /* clear kernel flag */      \
  97.     (_regs)->exr = 0x78;       /* enable all interrupts */  \
  98.     (_regs)->er5 = current->mm->start_data;    /* GOT base */  \
  99.     /* 14 = space for retaddr(4), vector(4), er0(4) and ext(2) on stack */ \
  100.     wrusp(((unsigned long)(_usp)) - 14);                    \
  101. } while(0)
  102. #endif
  103.  
  104. /* Forward declaration, a strange C thing */
  105. struct task_struct;
  106.  
  107. /* Free all resources held by a thread. */
  108. static inline void release_thread(struct task_struct *dead_task)
  109. {
  110. }
  111.  
  112. extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
  113.  
  114. #define prepare_to_copy(tsk)    do { } while (0)
  115.  
  116. /*
  117.  * Free current thread data structures etc..
  118.  */
  119. static inline void exit_thread(void)
  120. {
  121. }
  122.  
  123. /*
  124.  * Return saved PC of a blocked thread.
  125.  */
  126. unsigned long thread_saved_pc(struct task_struct *tsk);
  127. unsigned long get_wchan(struct task_struct *p);
  128.  
  129. #define    KSTK_EIP(tsk)    \
  130.     ({            \
  131.     unsigned long eip = 0;     \
  132.     if ((tsk)->thread.esp0 > PAGE_SIZE && \
  133.         MAP_NR((tsk)->thread.esp0) < max_mapnr) \
  134.           eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
  135.     eip; })
  136. #define    KSTK_ESP(tsk)    ((tsk) == current ? rdusp() : (tsk)->thread.usp)
  137.  
  138. #define cpu_relax()    barrier()
  139.  
  140. #endif
  141.